import {serverConfig} from "./ApiAIChat.ts";


const generateOptionsByPrompt = (content: string, prompt: string) => {
    return {
        method: 'POST',
        headers: {
            Authorization:  serverConfig.token,
            'Content-Type': 'application/json'
        },
        body: JSON.stringify({
            "model": serverConfig.model,
            "messages": [
                {"role": "system", "content": prompt},
                {"role": "user", "content": content}
            ],
            "stream": false,
            "max_tokens": 512,
            "stop": null,
            "temperature": 0.7,
            "top_p": 0.7,
            "top_k": 50,
            "frequency_penalty": 0.5,
            "n": 1,
            "response_format": {"type": "text"},
        })
    };
}
export const getSpeechBaseSlice = (content: string) => {
    const prompt = `
你是一个填表师，具有基础的医学与健康常识。
这是用户的情况自述，请你把用户的情况合理填入以下json表，你的最终输出应为如下格式的json表格。未提供的字段留空。请注意，你只能填写数字。
~~~json
{
    "Age": "年龄",
    "Gender": "性别（0为男，1为女）",
    "EducationLevel": "教育程度（0为无，1为中小学，2为本科，3为硕博）",
    "Height": "身高",
    "Weight": "体重（公斤）",
    "BMI": "BMI"
}
~~~
不要输出任何多余内容。
如果用户在胡言乱语或说无关内容，请你输出"Error"。
`
    return fetch(serverConfig.url, generateOptionsByPrompt(content, prompt))
}
export const getSpeechDiseaseSlice = (content: string) => {
    const prompt = `
你是一个判断师，具有基础的医学与健康常识。
这是用户的情况自述，请你把用户的情况合理填入以下json表，对于每一项，你只有0、1两种填法，0代表否，1代表是。你的最终输出应为如下格式的json表格。
若用户未提及则留空。
~~~json
{
    "Smoking": "吸烟情况",
    "AlcoholConsumption": "饮酒情况",
    "FamilyHistoryAlzheimers": "阿尔茨海默病家族史",
    "CardiovascularDisease": "心血管疾病",
    "Diabetes": "糖尿病",
    "Depression": "抑郁症",
    "HeadInjury": "头部受伤史",
    "Hypertension": "高血压",
}
~~~
不要输出任何多余内容。
如果用户在胡言乱语或说无关内容，请你输出"Error"。
`
    return fetch(serverConfig.url, generateOptionsByPrompt(content, prompt))
}
export const getSpeechHabitSlice = (content: string) => {
    const prompt = `
你是一个打分师，具有基础的医学与健康常识。
这是用户的情况自述，请你把用户的情况合理填入以下json表，对于每一项，你根据用户的描述进行打分，范围为数字0~10。你的最终输出应为如下格式的json表格。
用户未提供的字段留空。
~~~json
{
    "PhysicalActivity": "身体活动量（每周运动1小时为1分，超过10小时为10分）",
    "DietQuality": "饮食质量",
    "SleepQuality": "睡眠质量",
}
~~~
不要输出任何多余内容。
如果用户在胡言乱语或说无关内容，请你输出"Error"。
`
    return fetch(serverConfig.url, generateOptionsByPrompt(content, prompt))
}
export const getSpeechMentalSlice = (content: string) => {
    const prompt = `
你是一个医师，具有基础的医学与健康常识。
这是用户的情况自述，请你把用户的情况合理填入以下json表，对于每一项，你根据用户的描述进行填写。你的最终输出应为如下格式的json表格。
用户未提供的字段留空。
~~~json
{
     "SystolicBP": "收缩压 MmHg（毫米汞柱）",
     "DiastolicBP": "舒张压 MmHg（毫米汞柱）",
     "CholesterolTotal": "总胆固醇 TC",
     "CholesterolLDL": "低密度脂蛋白胆固醇 mmol/L",
    "CholesterolHDL": "高密度脂蛋白胆固醇 mmol/L",
     "CholesterolTriglycerides": "甘油三酯 mmol/L",
     "MMSE（Mini-Mental State Examination）": "简易精神状态检查表评分 0~30分",
     "ADL（Activities of Daily Living）": "日常生活活动能力表评分 1~10分",
     "FunctionalAssessment": "功能独立性评测 1~7",
}
~~~
数据库：
MMSE评分参考：
痴呆评分参考:
27: 正常（良好、优秀）
21: 轻度
15: 中度
5: 重度

FunctionalAssessment 评分参考：
独立：活动中不需他人帮助
7分：完全独立-- 构成活动的所有作业均能规范、完全地完成，不需修改和辅助设备或用品，并在合理的时间内完成。
6分：有条件的独立-- 具有下列一项或几项：活动中需要辅助设备；活动需要比正常长的时间；或有安全方面的考虑。
依赖：为了进行活动，患者需要另一个人予以监护或身体的接触性帮助，或者不进行活动有条件的依赖--患者付出50%或更多的努力，其所需的辅助水平如下：
5分：监护和准备-- 患者所需的帮助只限于备用、提示或劝告，帮助者和患者之间没有身体的接触或帮助者仅需要帮助准备必需用品；或帮助戴上矫形器。
4分：少量身体接触的帮助-- 患者所需的帮助只限于轻轻接触，自己能付出75%或以上的努力。
3分：中度身体接触的帮助-- 患者需要中度的帮助，自己能付出50%~75%的努力。完全依赖：患者需要一半以上的帮助或完全依赖他人，否则活动就不能进行。2分：大量身体接触的帮助-- 患者付出的努力小于50%，但大于25%。
1分：完全依赖-- 患者付出的努力小于25%。
不要输出任何多余内容。
如果用户在胡言乱语或说无关内容，请你输出"Error"。
`
    return fetch(serverConfig.url, generateOptionsByPrompt(content, prompt))
}
export const getSpeechMedicalSlice = (content: string) => {
    const prompt = `
你是一个判断师，具有基础的医学与健康常识。
这是用户的情况自述，请你把用户的情况合理填入以下json表，对于每一项，你只有0、1两种填法，0代表否，1代表是。你的最终输出应为如下格式的json表格。
如果你确信用户确实未提及相关内容，请你直接删去未提及的项，不要返回未提及的项。
~~~json
{
    "MemoryComplaints": "记忆方面是否存在问题",
    "BehavioralProblems": "行为是否不正常",
    "Confusion": "是否有困惑、糊涂症状",
    "Disorientation": "是否有空间方向定向障碍情况",
    "PersonalityChanges": "是否有人格改变情况",
    "DifficultyCompletingTasks": "是否难以完成生活任务",
    "Forgetfulness": "是否健忘",
}
~~~
不要输出任何多余内容。
如果用户在胡言乱语或说无关内容，请你输出"Error"。
`
    return fetch(serverConfig.url, generateOptionsByPrompt(content, prompt))
}
export const analysisSlice = (data: any) => {
    const content: string = data.choices[0].message.content
    if (content == "Error") {
        return false
    } else {
        if (content.startsWith("```json")) {
            return JSON.parse(content.substring(7, content.length - 3))
        } else {
            return false
        }
    }
}